package com.woniuxy.pxxt.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.woniuxy.pxxt.entity.User;
import com.woniuxy.pxxt.shiro.MyJsonWebToken;
import com.woniuxy.pxxt.shiro.MyRealm;
import org.apache.shiro.authc.AuthenticationInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * @Author: ideaAdmin
 * TODO: Class
 * TODO: JWT工具类
 * Date: 2022/2/23:11:39
 * Description:
 */

public class JWTUtil {
    //设置jwt的过期时间
    private static final long EXPIRES_TIME = 300 * 60 * 1000;

    /**
     * Author ideaAdmin
     * TODO: 签名生成JWT
     * Date 11:40 2022/2/23
     * * @param username 用于签名的往 Claim放入的信息
     * *  @param password 加密的盐值
     * * @return java.lang.String 返回一个token
     **/
    public static String sign(String username, String password) {
        //使用加密算法对盐进行加密
        Algorithm algorithm = Algorithm.HMAC256(password);

        return JWT.create()
                //设置属性
                .withClaim("username", username)
                //设置过期时间
                .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRES_TIME))
                //使用加密后的盐进行加密
                .sign(algorithm);
    }


    /**
     * Author ideaAdmin
     * TODO: 对前端发来的token 使用 账户密码 进行验证
     * Date 11:48 2022/2/23
     * * @param token
     * * @param username
     * * @param password
     * * @return boolean
     **/
    public static boolean verity(String token, String username, String password) {
        //使用加密算法 获得加密后的盐
        Algorithm algorithm = Algorithm.HMAC256(password);

        //传入签名的密钥 和 claim 属性 获得一个验证的对象
        JWTVerifier verifier = JWT.require(algorithm).withClaim("username", username).build();

        //校验失败会抛出异常
        verifier.verify(token);

        return true;
    }
    /**
     * Author ideaAdmin
     * TODO: 通过token 获得username
     * Date 11:53 2022/2/23
     * * @param token   
     * * @return java.lang.String 
     **/
    public static String  getUsername(String token){
        DecodedJWT decode = JWT.decode(token);
        return decode.getClaim("username").asString();
    }


}
